home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / dev / lang / Python16_Src.lha / Python16_Source / Modules / yuvconvert.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-08-03  |  3.0 KB  |  118 lines

  1. #include "yuv.h"
  2.  
  3. void
  4. yuv_sv411_to_cl422dc(int invert, void *data, void *yuv, int width, int height)
  5. {
  6.     struct yuv411 *in = data;
  7.     struct yuv422 *out_even = yuv;
  8.     struct yuv422 *out_odd = out_even + width / 2;
  9.     int i, j;        /* counters */
  10.  
  11.     for (i = height / 2; i--; ) {
  12.         for (j = width / 4; j--; ) {
  13.             YUV422_Y0(*out_even) = YUV411_Y00(*in);
  14.             YUV422_U0(*out_even) = YUV411_U00(*in);
  15.             YUV422_V0(*out_even) = YUV411_V00(*in);
  16.             YUV422_Y1(*out_even) = YUV411_Y01(*in);
  17.             out_even++;
  18.             YUV422_Y0(*out_even) = YUV411_Y02(*in);
  19.             YUV422_U0(*out_even) = YUV411_U02(*in);
  20.             YUV422_V0(*out_even) = YUV411_V02(*in);
  21.             YUV422_Y1(*out_even) = YUV411_Y03(*in);
  22.             out_even++;
  23.             YUV422_Y0(*out_odd) = YUV411_Y10(*in);
  24.             YUV422_U0(*out_odd) = YUV411_U10(*in);
  25.             YUV422_V0(*out_odd) = YUV411_V10(*in);
  26.             YUV422_Y1(*out_odd) = YUV411_Y11(*in);
  27.             out_odd++;
  28.             YUV422_Y0(*out_odd) = YUV411_Y12(*in);
  29.             YUV422_U0(*out_odd) = YUV411_U12(*in);
  30.             YUV422_V0(*out_odd) = YUV411_V12(*in);
  31.             YUV422_Y1(*out_odd) = YUV411_Y13(*in);
  32.             out_odd++;
  33.             in++;
  34.         }
  35.         out_even += width / 2;
  36.         out_odd += width / 2;
  37.     }
  38. }
  39.  
  40. void
  41. yuv_sv411_to_cl422dc_quartersize(int invert, void *data, void *yuv,
  42.                  int width, int height)
  43. {
  44.     int w4 = width / 4;    /* quarter of width is used often */
  45.     struct yuv411 *in_even = data;
  46.     struct yuv411 *in_odd = in_even + w4;
  47.     struct yuv422 *out_even = yuv;
  48.     struct yuv422 *out_odd = out_even + w4;
  49.     int i, j;        /* counters */
  50.     int u, v;        /* U and V values */
  51.  
  52.     for (i = height / 4; i--; ) {
  53.         for (j = w4; j--; ) {
  54.             u = YUV411_U00(*in_even);
  55.             v = YUV411_V00(*in_even);
  56.  
  57.             YUV422_Y0(*out_even) = YUV411_Y00(*in_even);
  58.             YUV422_U0(*out_even) = u;
  59.             YUV422_V0(*out_even) = v;
  60.             YUV422_Y1(*out_even) = YUV411_Y02(*in_even);
  61.  
  62.             YUV422_Y0(*out_odd) = YUV411_Y10(*in_odd);
  63.             YUV422_U0(*out_odd) = u;
  64.             YUV422_V0(*out_odd) = v;
  65.             YUV422_Y1(*out_odd) = YUV411_Y12(*in_odd);
  66.  
  67.             in_even++;
  68.             in_odd++;
  69.             out_even++;
  70.             out_odd++;
  71.         }
  72.         in_even += w4;
  73.         in_odd += w4;
  74.         out_even += w4;
  75.         out_odd += w4;
  76.     }
  77. }
  78.  
  79. void
  80. yuv_sv411_to_cl422dc_sixteenthsize(int invert, void *data, void *yuv,
  81.                    int width, int height)
  82. {
  83.     int w4_3 = 3 * width / 4; /* three quarters of width is used often */
  84.     int w8 = width / 8;    /* and so is one eighth */
  85.     struct yuv411 *in_even = data;
  86.     struct yuv411 *in_odd = in_even + width / 2;
  87.     struct yuv422 *out_even = yuv;
  88.     struct yuv422 *out_odd = out_even + w8;
  89.     int i, j;        /* counters */
  90.     int u, v;        /* U and V values */
  91.  
  92.     for (i = height / 8; i--; ) {
  93.         for (j = w8; j--; ) {
  94.             u = YUV411_U00(in_even[0]);
  95.             v = YUV411_V00(in_even[0]);
  96.  
  97.             YUV422_Y0(*out_even) = YUV411_Y00(in_even[0]);
  98.             YUV422_U0(*out_even) = u;
  99.             YUV422_V0(*out_even) = v;
  100.             YUV422_Y1(*out_even) = YUV411_Y00(in_even[1]);
  101.  
  102.             YUV422_Y0(*out_odd) = YUV411_Y00(in_odd[0]);
  103.             YUV422_U0(*out_odd) = u;
  104.             YUV422_V0(*out_odd) = v;
  105.             YUV422_Y1(*out_odd) = YUV411_Y00(in_even[1]);
  106.  
  107.             in_even += 2;
  108.             in_odd += 2;
  109.             out_even++;
  110.             out_odd++;
  111.         }
  112.         in_even += w4_3;
  113.         in_odd += w4_3;
  114.         out_even += w8;
  115.         out_odd += w8;
  116.     }
  117. }
  118.